package br.unidocs.modelo.entidade;

import java.io.Serializable;
import java.util.Date;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.eclipse.persistence.annotations.ConversionValue;
import org.eclipse.persistence.annotations.Convert;
import org.eclipse.persistence.annotations.ObjectTypeConverter;

import br.unidocs.enums.EnumCSS;
import br.unidocs.enums.EnumTipoUsuario;

/**
 * The persistent class for the usuarios database table.
 * 
 */

@NamedQueries({
		@NamedQuery(name = "localizaUsuarioPorEmail", query = "select u from Usuario u where u.email = :email"),
		@NamedQuery(name = "localizaUsuarioPorLogin", query = "select u from Usuario u where u.login = :login") })
@Entity
@Table(name = "usuarios")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "tipo_usu", discriminatorType = DiscriminatorType.CHAR)
@DiscriminatorValue(value = "U")
public class Usuario implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@SequenceGenerator(name = "USUARIOS_ID_GENERATOR", sequenceName = "SEQ_ID_USU", allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USUARIOS_ID_GENERATOR")
	@Column(name = "id_usu")
	private Integer id;

	@Column(name = "nome_usu")
	private String nome;

	@Column(name = "email_usu")
	private String email;

	@Column(name = "login_usu")
	private String login;

	@Column(name = "senha_usu")
	private String senha;

	@Column(name = "css_usu")
	private EnumCSS cssEscolhido;

	@Temporal(TemporalType.DATE)
	@Column(name = "dt_desativ_usu")
	private Date dataDesativacao;

	// bi-directional many-to-one association to Arquivo
	@OneToMany(mappedBy = "usuario")
	private Set<Arquivo> arquivos;

	// bi-directional many-to-one association to Comentario
	@OneToMany(mappedBy = "usuario")
	private Set<Comentario> comentarios;

	// bi-directional many-to-one association to Mensagem
	@OneToMany(mappedBy = "usuario")
	private Set<Mensagem> mensagens;

	// // bi-directional many-to-one association to Voto
	// @OneToMany(mappedBy = "usuario")
	// private List<Voto> votos;

	@ObjectTypeConverter(name = "conversorTipoUsuario", objectType = EnumTipoUsuario.class, dataType = String.class, conversionValues = {
			@ConversionValue(objectValue = "ADMIN", dataValue = "A"),
			@ConversionValue(objectValue = "NORMAL", dataValue = "U") })
	@Column(name = "tipo_usu")
	@Convert(value = "conversorTipoUsuario")
	private EnumTipoUsuario tipoUsuario;

	public Usuario() {
	}

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNome() {
		return this.nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEmail() {
		return this.email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getLogin() {
		return this.login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return this.senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public Date getDataDesativacao() {
		return this.dataDesativacao;
	}

	public void setDataDesativacao(Date dataDesativacao) {
		this.dataDesativacao = dataDesativacao;
	}

	public Set<Arquivo> getArquivos() {
		return this.arquivos;
	}

	public void setArquivos(Set<Arquivo> arquivos) {
		this.arquivos = arquivos;
	}

	public Set<Comentario> getComentarios() {
		return this.comentarios;
	}

	public void setComentarios(Set<Comentario> comentarios) {
		this.comentarios = comentarios;
	}

	public Set<Mensagem> getMensagens() {
		return this.mensagens;
	}

	public void setMensagens(Set<Mensagem> mensagens) {
		this.mensagens = mensagens;
	}

	// public List<Voto> getVotos() {
	// return this.votos;
	// }
	//
	// public void setVotos(List<Voto> votos) {
	// this.votos = votos;
	// }

	public EnumCSS getCssEscolhido() {
		return cssEscolhido;
	}

	public void setCssEscolhido(EnumCSS cssEscolhido) {
		this.cssEscolhido = cssEscolhido;
	}

	public EnumTipoUsuario getTipoUsuario() {
		return tipoUsuario;
	}

	public void setTipoUsuario(EnumTipoUsuario tipoUsuario) {
		this.tipoUsuario = tipoUsuario;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((cssEscolhido == null) ? 0 : cssEscolhido.hashCode());
		result = prime * result
				+ ((dataDesativacao == null) ? 0 : dataDesativacao.hashCode());
		result = prime * result + ((email == null) ? 0 : email.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((login == null) ? 0 : login.hashCode());
		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
		result = prime * result + ((senha == null) ? 0 : senha.hashCode());
		result = prime * result
				+ ((tipoUsuario == null) ? 0 : tipoUsuario.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Usuario other = (Usuario) obj;
		if (cssEscolhido != other.cssEscolhido)
			return false;
		if (dataDesativacao == null) {
			if (other.dataDesativacao != null)
				return false;
		} else if (!dataDesativacao.equals(other.dataDesativacao))
			return false;
		if (email == null) {
			if (other.email != null)
				return false;
		} else if (!email.equals(other.email))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (login == null) {
			if (other.login != null)
				return false;
		} else if (!login.equals(other.login))
			return false;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		if (senha == null) {
			if (other.senha != null)
				return false;
		} else if (!senha.equals(other.senha))
			return false;
		if (tipoUsuario != other.tipoUsuario)
			return false;
		return true;
	}

}